/*
 * Copyright (C) 2008,2009,2010,2011  Paulo Cesar Pereira de Andrade.
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * Authors:
 *	Paulo Cesar Pereira de Andrade
 */

#ifndef _enumber_t
#define _enumber_t

#include "etypes.h"

/*
 * Prototypes
 */
extern ebool_t
enumber_get(eobject_t o, evalue_t *n);

extern void
enumber_coerce(evalue_t *l, evalue_t *r);

extern eobject_t
enumber_create(evalue_t *n);

extern ebool_t
enumber_offset(eobject_t object, eint32_t *offset);

extern ebool_t
eintfix_p(eobject_t object);

extern ebool_t
einteger_p(eobject_t object);

extern ebool_t
enumber_p(eobject_t object);

extern ebool_t
efalse_p(eobject_t object);

extern void
enumber_andand(evalue_t *l, evalue_t *r);

extern void
enumber_oror(evalue_t *l, evalue_t *r);

extern void
enumber_lt(evalue_t *l, evalue_t *r);

extern void
enumber_le(evalue_t *l, evalue_t *r);

extern void
enumber_ge(evalue_t *l, evalue_t *r);

extern void
enumber_gt(evalue_t *l, evalue_t *r);

extern void
enumber_ne(evalue_t *l, evalue_t *r);

extern void
enumber_eq(evalue_t *l, evalue_t *r);

extern void
enumber_bool(evalue_t *l);

extern void
enumber_not(evalue_t *l);

extern void
einteger_and(evalue_t *l, evalue_t *r);

extern void
einteger_or(evalue_t *l, evalue_t *r);

extern void
einteger_xor(evalue_t *l, evalue_t *r);

extern void
enumber_mul2(evalue_t *l, evalue_t *r);

extern void
enumber_div2(evalue_t *l, evalue_t *r);

extern void
enumber_shl(evalue_t *l, evalue_t *r);

extern void
enumber_shr(evalue_t *l, evalue_t *r);

extern void
einteger_com(evalue_t *l);

extern void
enumber_add(evalue_t *l, evalue_t *r);

extern void
enumber_sub(evalue_t *l, evalue_t *r);

extern void
enumber_mul(evalue_t *l, evalue_t *r);

extern void
enumber_div(evalue_t *l, evalue_t *r);

extern void
enumber_trunc2(evalue_t *l, evalue_t *r);

extern void
enumber_rem(evalue_t *l, evalue_t *r);

extern void
enumber_atan2(evalue_t *l, evalue_t *r);

extern void
enumber_pow(evalue_t *l, evalue_t *r);

extern void
enumber_hypot(evalue_t *l, evalue_t *r);

extern void
enumber_complex(evalue_t *l, evalue_t *r);

extern void
enumber_inv(evalue_t *l);

extern void
enumber_neg(evalue_t *l);

extern void
enumber_signbit(evalue_t *l);

extern void
enumber_signum(evalue_t *l);

extern void
enumber_rational(evalue_t *l);

extern void
enumber_integer_p(evalue_t *l);

extern void
enumber_rational_p(evalue_t *l);

extern void
enumber_float_p(evalue_t *l);

extern void
enumber_real_p(evalue_t *l);

extern void
enumber_complex_p(evalue_t *l);

extern void
enumber_number_p(evalue_t *l);

extern void
enumber_finite_p(evalue_t *l);

extern void
enumber_inf_p(evalue_t *l);

extern void
enumber_nan_p(evalue_t *l);

extern void
enumber_num(evalue_t *l);

extern void
enumber_den(evalue_t *l);

extern void
enumber_real(evalue_t *l);

extern void
enumber_imag(evalue_t *l);

extern void
enumber_arg(evalue_t *l);

extern void
enumber_conj(evalue_t *l);

extern void
enumber_floor(evalue_t *l);

extern void
enumber_trunc(evalue_t *l);

extern void
enumber_round(evalue_t *l);

extern void
enumber_ceil(evalue_t *l);

extern void
enumber_abs(evalue_t *l);

extern void
enumber_sqrt(evalue_t *l);

extern void
enumber_cbrt(evalue_t *l);

extern void
enumber_sin(evalue_t *l);

extern void
enumber_cos(evalue_t *l);

extern void
enumber_tan(evalue_t *l);

extern void
enumber_asin(evalue_t *l);

extern void
enumber_acos(evalue_t *l);

extern void
enumber_atan(evalue_t *l);

extern void
enumber_sinh(evalue_t *l);

extern void
enumber_cosh(evalue_t *l);

extern void
enumber_tanh(evalue_t *l);

extern void
enumber_asinh(evalue_t *l);

extern void
enumber_acosh(evalue_t *l);

extern void
enumber_atanh(evalue_t *l);

extern void
enumber_proj(evalue_t *l);

extern void
enumber_exp(evalue_t *l);

extern void
enumber_log(evalue_t *l);

extern void
enumber_log2(evalue_t *l);

extern void
enumber_log10(evalue_t *l);

#endif /* _enumber_t */
